package com.mystudy.atomic.atomicIntegerFieldUpdater;

import org.junit.Test;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.stream.IntStream;
import  java.util.concurrent.atomic.AtomicStampedReference;
/**
 * todo: {@link AtomicIntegerFieldUpdater}对属性进行原子的更新,volatile不保证原子性
 * 不能访问私有的属性和protected类型的，会报错{@link IllegalAccessException}
 * 传入的对象不能为null，因为使用的是反射获取的值，会报错{@link NoSuchFieldException}
 * 设置值的类型需要与被设置的字段的类型相同
 * 字段的必须被volatile修饰
 *
 * 相比较于使用{@link AtomicStampedReference}来说，使用 {@link AtomicIntegerFieldUpdater}
 * 消耗的内存比较小，因为{@link AtomicStampedReference}会把引用的对象保存在引用中，而自己本身也会占用内存
 * @Author acy
 * @Date 2019/06/07
 */
public class AtomicIntegerFieldUpdaterTest {

	@Test
	public void test() throws Exception{
		AtomicIntegerFieldUpdater<TestMe>  updater=AtomicIntegerFieldUpdater.newUpdater(TestMe.class,"i");
		TestMe me = new TestMe();
		IntStream.range(0,2).forEach(i->new Thread(()->{
			final int MAX=20;
			for (int i1 = 0; i1 < MAX; i1++) {
				int getValue = updater.incrementAndGet(me);
				System.out.println(Thread.currentThread().getName()+"---"+getValue);
			}
		}).start());
	}

	@Test
	public void test1() throws Exception{
		AtomicIntegerFieldUpdater<TestMe>  updater=AtomicIntegerFieldUpdater.newUpdater(TestMe.class,"i");
		updater.compareAndSet(null,0,1);
	}

	@Test
	public void test3() throws Exception{
		AtomicIntegerFieldUpdater<TestMe2>  updater=AtomicIntegerFieldUpdater.newUpdater(TestMe2.class,"i");
		updater.compareAndSet(null,0,1);
	}
	static class TestMe{
		volatile int i;
	}
	static class TestMe2{
		int i;
	}
}
